package com.qidian.mes.sys.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.github.pagehelper.PageInfo;
import com.qidian.mes.log.annotation.OptionLogAnnotation;
import com.qidian.mes.log.emum.OptionType;
import com.qidian.mes.pojo.Dict;
import com.qidian.mes.sys.excel.ExcelReadListener;
import com.qidian.mes.sys.service.DictService;
import com.qidian.mes.util.pojo.MESResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.net.http.HttpResponse;
import java.util.Collection;
import java.util.List;

/**
 * @Author 戴着假发的程序员
 * @Company 起点编程
 * @Time 2023/10/24 14:23
 * @Description
 */
@RestController
@CrossOrigin
@RequestMapping("/dict")
public class DictController {
    @Autowired
    private DictService dictService;
    @Autowired
    private ExcelReadListener excelReadListener;
    @GetMapping("/export")
    // 这里要实现文件下载，所以没有返回值。
    public void exportDicts(@RequestParam(defaultValue = "1")int page, @RequestParam(defaultValue = "10") int limit, Dict dict, HttpServletResponse response) throws IOException {
        // 调用Service查询需要的数据
        MESResult<PageInfo<Dict>> result = dictService.list(page, limit, dict);
        // 设置响应头消息
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 文件名
        String fileName = URLEncoder.encode("字典列表","utf-8");
        // 设置响应头 (所有的文件下载都有这个设置) attachment强制浏览器将这个文件以附件的形式下载。
        response.addHeader("Content-Disposition","attachment;filename=" + fileName + ".xlsx");
        // 如果我们希望在跨域请求中，axios可以获取指定的请求头，就需要做下面的设置。
        response.addHeader("Access-Control-Expose-Headers","Content-Disposition");
        //使用EasyExcel写数据
        // 参数1：输出流，这个输出流指向哪里，这个文件就写到哪里去。
        // 参数2：实体类的类型
        ExcelWriterBuilder builder = EasyExcel.write(response.getOutputStream(),Dict.class);
        // 得到sheet
        ExcelWriterSheetBuilder sheet = builder.sheet();
        // 写数据 result.getData得到的是一个PageInfo对象，通过PageInfo的getList获取数据列表
        sheet.doWrite(((PageInfo) result.getData()).getList());
    }
    @PostMapping("/import")
    public MESResult importDicts(@RequestParam("uploadFile") MultipartFile uploadFile) throws IOException {
        // 按照官方给出的内容编写
        // 创建一个ExcelReaderBuilder 需要三个参数：
        // 参数1： 文件对象，或者文件输入刘对象，或者文件路径
        // 参数2： 要转换的数据对象的class
        // 参数3： 我们定义的监听器
        ExcelReaderBuilder builder = EasyExcel.read(uploadFile.getInputStream(),Dict.class,excelReadListener);
        // 获取excel中的sheet  sheet方法有好几个重载的方法，可以传入sheet的名称，索引来指定获取哪个sheet，默认获取第一个。
        ExcelReaderSheetBuilder sheet = builder.sheet(0);
        // 读取数据，读取的过程中，会自动执行监听器的内容
        sheet.doRead();
        // 我这里暂时只能拿到最后一次的结果
        return excelReadListener.getResult();
    }


    @GetMapping("/list")
    public MESResult list(@RequestParam(defaultValue = "1")int page, @RequestParam(defaultValue = "10") int limit, Dict dict){
        return dictService.list(page,limit,dict);
    }
    @GetMapping("/get")
    public MESResult get(Long id){
        return dictService.get(id);
    };

    /**
     *
     * @param dict
     * @return
     */
    @PostMapping("/save")
    @OptionLogAnnotation(optionModule = "sys",optionType = OptionType.INSERT)
    public MESResult save(@RequestBody Dict dict, HttpServletRequest request) {
        return dictService.save(dict);
    }
}
